package com.estagio.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.primefaces.context.RequestContext;

import com.estagio.entity.Fornecedor;
import com.estagio.entity.CondicaoPagamento;
import com.estagio.entity.ContaPagar;
import com.estagio.entity.FormaPagamento;
import com.estagio.entity.ItemCompra;
import com.estagio.entity.Produto;
import com.estagio.entity.Compra;
import com.estagio.session.FornecedorSession;
import com.estagio.session.CondicaoPagamentoSession;
import com.estagio.session.ContaPagarSession;
import com.estagio.session.ItemCompraSession;
import com.estagio.session.ProdutoSession;
import com.estagio.session.CompraSession;

@ManagedBean(name="compraBean")
@SessionScoped
public class CompraBean {
	
	//VENDA
	private Compra compra = new Compra();
	private Compra compraSave = new Compra();
	private DataModel dmCompra;
	private Double somaValorTotal;
	
	//PRODUTO
	private Produto produto = new Produto();
	private DataModel dmProduto;	
	
	//ITEMVENDA
	private ItemCompra itemCompra = new ItemCompra();
	private DataModel dmItemCompra;
	private ItemCompra itemCompraSelect = new ItemCompra();
	private List<ItemCompra> arrayItemCompra;
	
	//CONDICAO DE PAGAMENTO
	private CondicaoPagamento condicaoPagamento = new CondicaoPagamento();
	private DataModel dmCondicaoPagamento;
	private List<CondicaoPagamento> arrayCondicaoPagamento;
	
	//ALUNO
	private Fornecedor fornecedor  = new Fornecedor();
	private DataModel dmFornecedor;

	//CONTAS A RECEBER
	private List<ContaPagar> listContaPagar;

	//GETTERS AND SETTERS	
	
	public Compra getCompra() {
		return compra;
	}

	public ItemCompra getItemCompraSelect() {
		return itemCompraSelect;
	}

	public void setItemCompraSelect(ItemCompra itemCompraSelect) {
		this.itemCompraSelect = itemCompraSelect;
	}

	public Fornecedor getFornecedor() {
		return fornecedor ;
	}

	public void setFornecedor(Fornecedor fornecedor ) {
		this.fornecedor  = fornecedor ;
	}

	public DataModel getDmFornecedor() {
		return dmFornecedor;
	}

	public void setDmFornecedor(DataModel dmFornecedor) {
		this.dmFornecedor = dmFornecedor;
	}

	public void setCompra(Compra compra) {
		this.compra = compra;
	}

	public Compra getCompraSave() {
		return compraSave;
	}

	public void setCompraSave(Compra compraSave) {
		this.compraSave = compraSave;
	}

	public DataModel getDmCompra() {
		return dmCompra;
	}

	public void setDmCompra(DataModel dmCompra) {
		this.dmCompra = dmCompra;
	}

	public Double getSomaValorTotal() {
		return somaValorTotal;
	}

	public void setSomaValorTotal(Double somaValorTotal) {
		this.somaValorTotal = somaValorTotal;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public DataModel getDmProduto() {
		return dmProduto;
	}

	public void setDmProduto(DataModel dmProduto) {
		this.dmProduto = dmProduto;
	}

	public ItemCompra getItemCompra() {
		return itemCompra;
	}

	public void setItemCompra(ItemCompra itemCompra) {
		this.itemCompra = itemCompra;
	}

	public DataModel getDmItemCompra() {
		return dmItemCompra;
	}

	public void setDmItemCompra(DataModel dmItemCompra) {
		this.dmItemCompra = dmItemCompra;
	}
	
	public List<ItemCompra> getArrayItemCompra() {
		return arrayItemCompra;
	}

	public void setArrayItemCompra(List<ItemCompra> arrayItemCompra) {
		this.arrayItemCompra = arrayItemCompra;
	}

	public CondicaoPagamento getCondicaoPagamento() {
		return condicaoPagamento;
	}

	public void setCondicaoPagamento(CondicaoPagamento condicaoPagamento) {
		this.condicaoPagamento = condicaoPagamento;
	}

	public DataModel getDmCondicaoPagamento() {
		return dmCondicaoPagamento;
	}

	public void setDmCondicaoPagamento(DataModel dmCondicaoPagamento) {
		this.dmCondicaoPagamento = dmCondicaoPagamento;
	}

	public List<CondicaoPagamento> getArrayCondicaoPagamento() {
		return arrayCondicaoPagamento;
	}

	public void setArrayCondicaoPagamento(
			List<CondicaoPagamento> arrayCondicaoPagamento) {
		this.arrayCondicaoPagamento = arrayCondicaoPagamento;
	}

	public List<ContaPagar> getListContaPagar() {
		return listContaPagar;
	}

	public void setListContaPagar(List<ContaPagar> listContaPagar) {
		this.listContaPagar = listContaPagar;
	}
	
	//VENDA



	public void saveCompra() {
		CompraSession session = new CompraSession();
		String mensagem = session.save(this.compra, this.arrayItemCompra, this.listContaPagar);
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
		RequestContext.getCurrentInstance().update("panelManterCompra");
		RequestContext.getCurrentInstance().update("growl");

	}

	public String deleteCompra() {
		CompraSession compraRN = new CompraSession();		
		Compra compra = this.compraSave;
		String mensagem = compraRN.delete(compra);
		this.compraSave = new Compra();
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarCompra";
	}

	public DataModel findCompra() {
		CompraSession compraSession = new CompraSession();
		List<Compra> lista = compraSession.find(this.compra, null);
		this.dmCompra = new ListDataModel(lista);
		RequestContext.getCurrentInstance().update("dataTableCompra");
		return this.dmCompra;
		
	}
	
	public void clean() {
		this.compra = new Compra();
	}
	
	//ALUNO
		public DataModel findFornecedor() {
			FornecedorSession session = new FornecedorSession();
			List<Fornecedor> lista = session.find(this.fornecedor );
			this.dmFornecedor = new ListDataModel(lista);
			return this.dmFornecedor;
		}
		
		public void selectFornecedor() {
			this.compra.setFornecedor((Fornecedor) this.dmFornecedor.getRowData());
			RequestContext.getCurrentInstance().update("pgFornecedor");
			RequestContext.getCurrentInstance().execute("dialogConsultarFornecedor.hide()");
		}
	

	//PRODUTO
//	public void saveProduto() {
//		ProdutoSession produtoSession = new ProdutoSession();
//		Produto produto = this.produto;		
//		this.mensagem = produtoSession.save(produto);
//		
//		FacesMessage faces = new FacesMessage(this.mensagem);
//		FacesContext contexto = FacesContext.getCurrentInstance();
//		contexto.addMessage(null, faces);		
//	}
//
//	public String deleteProduto() {
//		ProdutoSession produtoRN = new ProdutoSession();		
//		Produto produto = this.produtoSelecionado;
//		this.mensagem = produtoRN.delete(produto);
//		this.produtoSelecionado = new Produto();
//		FacesMessage faces = new FacesMessage(mensagem);
//		FacesContext contexto = FacesContext.getCurrentInstance();
//		contexto.addMessage(null, faces);
//		return "consultarProduto";
//	}

	public DataModel findProduto() {
		RequestContext.getCurrentInstance().update("panelDialogConsultarProduto");		
		
		List<Produto> listaProduto = new ProdutoSession().find(this.produto);
		this.dmProduto = new ListDataModel(listaProduto);
		return this.dmProduto;
	}

	public void selectProduto() {
		Produto produto = (Produto) this.dmProduto.getRowData();
		this.itemCompra.setProduto(produto);
		RequestContext.getCurrentInstance().update("pgItemCompra");
		RequestContext.getCurrentInstance().execute("dialogConsultarProduto.hide()");		
	}	
	
	public void addItemCompra() {		
		ItemCompraSession session = new ItemCompraSession();
		String valida = session.valida(this.arrayItemCompra, this.itemCompra);
		
		if((valida.equals(""))) {
			this.itemCompra.setPrecoTotal(this.itemCompra.getProduto().getValor() * this.itemCompra.getQuantidade());
			this.somaValorTotal = this.somaValorTotal + this.itemCompra.getPrecoTotal();
			this.arrayItemCompra.add(this.itemCompra);
			RequestContext.getCurrentInstance().update("pgProduto");
			RequestContext.getCurrentInstance().update("tableItemCompra");
			RequestContext.getCurrentInstance().execute("dialogConsultarProduto.hide()");
		} else {
			FacesMessage faces = new FacesMessage(valida);
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, faces);
			RequestContext.getCurrentInstance().update("growl");
		}
		this.compra.setValorTotal(this.somaValorTotal);
		this.itemCompra = new ItemCompra();
		this.itemCompra.setProduto(new Produto());
		RequestContext.getCurrentInstance().update("pgItemCompra");
		RequestContext.getCurrentInstance().update("pgCondicaoPagamento");

	}
	
	public Boolean disableCalculaTotalCompra() {
		if(this.compra.getCondicaoPagamento().getIdCondicaoPagamento() != null) {
			return false;
		} else {
			return true;
		}
	}
	
	public void calculaTotalCompra() {
		System.out.println("entrou");
		CompraSession session = new CompraSession();
		this.compra = session.calculaTotal(this.compra, this.somaValorTotal);
		ContaPagarSession sessionCR = new ContaPagarSession();
		ContaPagar cr = new ContaPagar();
		cr.setCompra(this.compra);
		this.listContaPagar = sessionCR.validaContaPagar(cr);
		
		RequestContext.getCurrentInstance().update("pgTotal");
		RequestContext.getCurrentInstance().update("tableParcela");
	}
	
		
	//CONDICAO DE PAGAMENTO
	public DataModel findCondicaoPagamento() {
		List<CondicaoPagamento> listaCondicaoPagamento = new CondicaoPagamentoSession().find(this.condicaoPagamento);
		this.dmCondicaoPagamento = new ListDataModel(listaCondicaoPagamento);
		return this.dmCondicaoPagamento;
	}

	public void selectCondicaoPagamento() {
		CondicaoPagamento condicaoPagamento = (CondicaoPagamento) this.dmCondicaoPagamento.getRowData();
		this.compra.setCondicaoPagamento(condicaoPagamento);
		RequestContext.getCurrentInstance().update("pgCondicaoPagamento");
		RequestContext.getCurrentInstance().update("pgTotal");
		RequestContext.getCurrentInstance().execute("dialogConsultarCondicaoPagamento.hide()");
	}
	
	public Boolean disableCondicao() {
		if((this.somaValorTotal != null) && (this.somaValorTotal != 0)) {
			return false;
		} else {
			return true;
		}
	}

	
	//INVOCAR TELAS
	public String newCompra() {
		this.compra = new Compra();
		this.compra.setFornecedor(new Fornecedor());
		this.compra.setCondicaoPagamento(new CondicaoPagamento());
		this.compra.getCondicaoPagamento().setFormaPagamento(new FormaPagamento());
		this.compra.setDtCompra(new Date());
		this.arrayCondicaoPagamento = new ArrayList<CondicaoPagamento>();
		this.condicaoPagamento = new CondicaoPagamento();
		this.somaValorTotal = 0.00;
		this.arrayItemCompra = new ArrayList<ItemCompra>();
		this.itemCompra = new ItemCompra();
		this.itemCompra.setProduto(new Produto());
		this.listContaPagar = new ArrayList<ContaPagar>();
		return "manterCompra";
	}

	public String consultarCompra() {
		this.compra = new Compra();
		this.compra.setFornecedor(new Fornecedor());
		return "consultarCompra";
	}

	public String editarCompra() {
		this.compraSave = (Compra) this.dmCompra.getRowData();		
		return "editarCompra";
	}
	
	public String excluirCompra() {
		this.compraSave = (Compra) this.dmCompra.getRowData();
		return "excluirCompra";
	}
	
	//DIALOGS
	public void openDialogConsultarCondicaoPagamento() {
		RequestContext.getCurrentInstance().update("idDialogConsultarCondicaoPagamento");
		RequestContext.getCurrentInstance().execute("dialogConsultarCondicaoPagamento.show()");
	}

	public void openDialogConsultarProduto() {
		RequestContext.getCurrentInstance().update("idDialogConsultarProduto");
		RequestContext.getCurrentInstance().execute("dialogConsultarProduto.show()");
	}
	
	public void openDialogConsultarFornecedor() {
		this.fornecedor  = new Fornecedor();
		RequestContext.getCurrentInstance().update("idDialogConsultarFornecedor");
		RequestContext.getCurrentInstance().execute("dialogConsultarFornecedor.show()");
	}
}
